home *** CD-ROM | disk | FTP | other *** search
/ Internet Surfer: Getting Started / Internet Surfer - Getting Started (Wayzata Technology)(7231)(1995).bin / pc / mac / bonus / peter_le / chat__ / tcp_libr / udpstuff.uni < prev   
Text File  |  1991-12-26  |  5KB  |  187 lines

  1. unit UDPStuff;
  2.  
  3. interface
  4.  
  5.     uses
  6.         TCPTypes;
  7.  
  8.     const
  9.         UDPDefaultBufferSize = 4048;
  10.  
  11.     type
  12.         UDPConnectionRecord = record
  13.                 magic: OSType;    { A magic number to try and avoid problems with released connection IDs. }
  14.                 stream: StreamPtr;
  15.                 outstanding: integer;
  16.             end;
  17.         UDPConnectionPtr = ^UDPConnectionRecord;
  18.  
  19.     function UDPInit: OSErr;
  20.     procedure UDPFinish;
  21.     function UDPCreate (var connection: UDPConnectionPtr; buffer_size: longInt; localport: integer): OSErr;
  22.     function UDPCreateDynamic (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  23.     function UDPRead (connection: UDPConnectionPtr; timeout: integer; var remoteIP: longInt; var remoteport: integer;{}
  24.                                     var datap: ptr; var datalen: integer): OSErr;
  25.     function UDPReturnBuffer (connection: UDPConnectionPtr; datap: ptr): OSErr;
  26.     function UDPDatagramsAvailable (connection: UDPConnectionPtr): integer;
  27.     function UDPWrite (connection: UDPConnectionPtr; remoteIP: longInt; remoteport: integer;{}
  28.                                     datap: ptr; datalen: integer; checksum: boolean): OSErr;
  29.     function UDPRelease (var connection: UDPConnectionPtr): OSErr;
  30.     function UDPMTU (remoteIP: longInt; var mtu: integer): OSErr;
  31.  
  32. implementation
  33.  
  34.     const
  35.         UDPMagic = 'UDPM';
  36.         UDPBad = '????';
  37.  
  38.     var
  39.         driver_refnum: integer;
  40.  
  41.     procedure ZeroCB (var cb: UDPControlBlock; stream: StreamPtr; call: integer);
  42.     { Zero out the control block parameters. }
  43.         var
  44.             i: integer;
  45.             p: longInt;
  46.     begin
  47.         for p := longInt(@cb) to longInt(@cb) + SizeOf(UDPControlBlock) - 1 do
  48.             ptr(p)^ := 0;
  49.         cb.udpStream := stream;
  50.         cb.ioCRefNum := driver_refnum;
  51.         cb.csCode := call;
  52.     end;
  53.  
  54.     function UDPInit: OSErr;
  55.         var
  56.             oe: OSErr;
  57.             i: integer;
  58.     begin
  59.         oe := OpenDriver('.IPP', driver_refnum);
  60.         UDPInit := oe;
  61.     end;
  62.  
  63.     procedure UDPFinish;
  64.     begin
  65.     end;
  66.  
  67.     procedure MyNotify (stream: streamPtr; eventCode: integer; connection: UDPConnectionPtr; icmpMsg: ptr);
  68.     begin
  69.         if eventCode = UDPDataArrival then
  70.             if connection^.magic = UDPMagic then
  71.                 connection^.outstanding := connection^.outstanding + 1;
  72.     end;
  73.  
  74.     function UDPCreateX (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  75.         var
  76.             oe: OSErr;
  77.             cb: UDPControlBlock;
  78.     begin
  79.         if buffer_size = 0 then
  80.             buffer_size := UDPDefaultBufferSize;
  81.         connection := UDPConnectionPtr(NewPtr(SizeOf(UDPConnectionRecord) + buffer_size));
  82.         oe := MemError;
  83.         if connection <> nil then begin
  84.             connection^.magic := UDPMagic;
  85.             ZeroCB(cb, nil, UDPcsCreate);
  86.             cb.create.rcvBuff := ptr(longInt(connection) + SizeOf(UDPConnectionRecord));
  87.             cb.create.rcvBuffLen := buffer_size;
  88.             cb.create.notifyProc := @MyNotify;
  89.             cb.create.userDataPtr := ptr(connection);
  90.             cb.create.localport := localport;
  91.             oe := PBControl(@cb, false);
  92.             localport := cb.create.localport;
  93.             connection^.stream := cb.udpStream;
  94.             connection^.outstanding := 0;
  95.         end;
  96.         UDPCreateX := oe;
  97.     end;
  98.  
  99.     function UDPCreate (var connection: UDPConnectionPtr; buffer_size: longInt; localport: integer): OSErr;
  100.     begin
  101.         UDPCreate := UDPCreateX(connection, buffer_size, localport);
  102.     end;
  103.  
  104.     function UDPCreateDynamic (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  105.     begin
  106.         localport := 0;
  107.         UDPCreateDynamic := UDPCreateX(connection, buffer_size, localport);
  108.     end;
  109.  
  110.     function UDPRead (connection: UDPConnectionPtr; timeout: integer; var remoteIP: longInt; var remoteport: integer;{}
  111.                                     var datap: ptr; var datalen: integer): OSErr;
  112.         var
  113.             oe: OSErr;
  114.             cb: UDPControlBlock;
  115.     begin
  116.         ZeroCB(cb, connection^.stream, UDPcsRead);
  117.         cb.receive.timeout := timeout;
  118.         oe := PBControl(@cb, false);
  119.         if oe = noErr then
  120.             connection^.outstanding := connection^.outstanding - 1;
  121.         remoteIP := cb.receive.remoteIP;
  122.         remoteport := cb.receive.remoteport;
  123.         datap := cb.receive.rcvBuff;
  124.         datalen := cb.receive.rcvBuffLen;
  125.         UDPRead := oe;
  126.     end;
  127.  
  128.     function UDPReturnBuffer (connection: UDPConnectionPtr; datap: ptr): OSErr;
  129.         var
  130.             oe: OSErr;
  131.             cb: UDPControlBlock;
  132.     begin
  133.         ZeroCB(cb, connection^.stream, UDPcsBfrReturn);
  134.         cb.return.rcvBuff := datap;
  135.         oe := PBControl(@cb, false);
  136.         UDPReturnBuffer := oe;
  137.     end;
  138.  
  139.     function UDPDatagramsAvailable (connection: UDPConnectionPtr): integer;
  140.     begin
  141.         UDPDatagramsAvailable := connection^.outstanding;
  142.     end;
  143.  
  144.     function UDPWrite (connection: UDPConnectionPtr; remoteIP: longInt; remoteport: integer;{}
  145.                                     datap: ptr; datalen: integer; checksum: boolean): OSErr;
  146.         var
  147.             oe: OSErr;
  148.             cb: UDPControlBlock;
  149.             wds: wdsType;
  150.     begin
  151.         ZeroCB(cb, connection^.stream, UDPcsWrite);
  152.         cb.send.remoteIP := remoteIP;
  153.         cb.send.remotePort := remoteport;
  154.         wds.size := datalen;
  155.         wds.buffer := datap;
  156.         wds.term := 0;
  157.         cb.send.wds := @wds;
  158.         cb.send.checksum := ord(checksum);
  159.         oe := PBControl(@cb, false);
  160.         UDPWrite := oe;
  161.     end;
  162.  
  163.     function UDPRelease (var connection: UDPConnectionPtr): OSErr;
  164.         var
  165.             oe: OSErr;
  166.             cb: UDPControlBlock;
  167.     begin
  168.         ZeroCB(cb, connection^.stream, UDPcsRelease);
  169.         oe := PBControl(@cb, false);
  170.         connection^.magic := UDPBad;
  171.         DisposPtr(ptr(connection));
  172.         UDPRelease := oe;
  173.     end;
  174.  
  175.     function UDPMTU (remoteIP: longInt; var mtu: integer): OSErr;
  176.         var
  177.             oe: OSErr;
  178.             cb: UDPControlBlock;
  179.     begin
  180.         ZeroCB(cb, nil, UDPcsMaxMTUSize);
  181.         cb.mtu.remoteIP := remoteIP;
  182.         oe := PBControl(@cb, false);
  183.         mtu := cb.mtu.mtuSize;
  184.         UDPMTU := oe;
  185.     end;
  186.  
  187. end.